#ifndef NEWTON_H
#define NEWTON_H

#include "nlp.h"

// 牛顿法主函数
// problem: NLP问题定义
// x0: 初始点(输入输出参数)
// mu: 障碍参数
// tol: 收敛容差
void newton_method(NLPProblem *problem, double *x0, double mu, double tol);

// 计算梯度
// problem: NLP问题定义
// x: 当前点
// mu: 障碍参数
// grad: 输出梯度向量(长度为problem->n)
void compute_gradient(NLPProblem *problem, double *x, double mu, double *grad);

// 计算Hessian矩阵(一维数组行优先存储)
// problem: NLP问题定义
// x: 当前点
// mu: 障碍参数
// hess: 输出Hessian矩阵(长度为problem->n * problem->n)
void compute_hessian(NLPProblem *problem, double *x, double mu, double *hess);

// 解线性方程组(一维数组行优先存储)
// A: 系数矩阵(n×n)
// b: 右端向量(n)
// n: 系统维度
// 返回: 解向量(需要调用者释放)
double *solve_linear_system(double *A, double *b, int n);

// 计算向量2范数
// vec: 输入向量
// n: 向量长度
double vector_norm(double *vec, int n);

#endif